package busterminal.persistence.jdbc.proxy;

import busterminal.entity.Route;
import busterminal.entity.ScheduledItem;
import busterminal.entity.service.DaysOfWeek;
import busterminal.entity.service.Time;
import busterminal.exception.BusinessException;
import busterminal.persistence.ScheduledItemDAO;
import busterminal.services.ServiceLocator;
import java.util.List;

/**
 * Класс - заместитель пункта расписания
 */
public class ScheduledItemProxy implements ScheduledItem {

    /**
     * Идентификатор объекта в базе данных
     */
    private int id;
    /**
     * Proxy-объект пункта расписания
     */
    private ScheduledItem proxyObject;

    /**
     * Конструктор по умолчанию
     */
    public ScheduledItemProxy() {
    }

    /**
     * Получить proxy-объект: если он не загружен, то загрузить и получить
     * @return proxy-объект
     */
    private ScheduledItem getProxy() {
        if (proxyObject == null) {
            proxyObject = ServiceLocator.getService(ScheduledItemDAO.class).read(id);
        }
        proxyObject.setTravelTime();
        return proxyObject;
    }

    /**
     * Получить идентификатор
     * @return идентификатор
     */
    @Override
    public Integer getId() {
        return id;
    }

    /**
     * Установить идентификатор
     * @param id идентификатор
     */
    @Override
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * Получить время прибытия
     * @return время прибытия
     */
    @Override
    public Time getArrivalTime() {
        return getProxy().getArrivalTime();
    }

    /**
     * Получить время прибытия на автовокзал
     * @return время прибытия на автовокзал
     */
    @Override
    public Time getArrivalTimeToBusTerminal() {
        return getProxy().getArrivalTimeToBusTerminal();
    }

    /**
     * Получить время отправления
     * @return время отправления
     */
    @Override
    public Time getDepartureTime() {
        return getProxy().getDepartureTime();
    }

    /**
     * Получить время отправления с конечного пункта
     * @return время отправления с конечного пункта
     */
    @Override
    public Time getDepartureTimeFromEndPoint() {
        return getProxy().getDepartureTimeFromEndPoint();
    }

    /**
     * Получить номер платформы, с которой будет отправляться автобус по определённому маршруту
     * @return номер платформы, с которой будет отправляться автобус по определённому маршруту
     */
    @Override
    public int getPlatformNumber() {
        return getProxy().getPlatformNumber();
    }

    /**
     * Получить маршрут, по которому осуществляется рейс
     * @return маршрут, по которому осуществляется рейс
     */
    @Override
    public Route getRoute() {
        return getProxy().getRoute();
    }

    /**
     * Получить дни недели осуществления рейсов по маршруту
     * @return дни недели осуществления рейсов по маршруту
     */
    @Override
    public List<DaysOfWeek> getRoutingDays() {
        return getProxy().getRoutingDays();
    }

    /**
     * Получить строку, содержащую дни недели осуществления рейсов по маршруту
     * @return строку, содержащая дни недели осуществления рейсов по маршруту
     */
    @Override
    public String getRoutingDaysString() {
        return getProxy().getRoutingDaysString();
    }

    /**
     * Получить время в пути
     * @return время в пути
     */
    @Override
    public Time getTravelTime() {
        return getProxy().getTravelTime();
    }

    /**
     * Установить время прибытия
     * @param arrivalTime время прибытия
     */
    @Override
    public void setArrivalTime(Time arrivalTime) {
        getProxy().setArrivalTime(arrivalTime);
    }

    /**
     * Установить время прибытия на автовокзал
     * @param arrivalTimeToBusTerminal время прибытия на автовокзал
     */
    @Override
    public void setArrivalTimeToBusTerminal(Time arrivalTimeToBusTerminal) {
        getProxy().setArrivalTimeToBusTerminal(arrivalTimeToBusTerminal);
    }

    /**
     * Установить время отправления
     * @param departureTime время отправления
     */
    @Override
    public void setDepartureTime(Time departureTime) {
        getProxy().setDepartureTime(departureTime);
    }

    /**
     * Установить время отправления с конечного пункта
     * @param departureTimeFromEndPoint время отправления с конечного пункта
     */
    @Override
    public void setDepartureTimeFromEndPoint(Time departureTimeFromEndPoint) {
        getProxy().setDepartureTimeFromEndPoint(departureTimeFromEndPoint);
    }

    /**
     * Установить номер платформы, с которой будет отправляться автобус по определённому маршруту
     * @param platformNumber номер платформы, с которой будет отправляться автобус по определённому маршруту
     */
    @Override
    public void setPlatformNumber(int platformNumber) {
        getProxy().setPlatformNumber(platformNumber);
    }

    /**
     * Установить маршрут, по которому осуществляется рейс
     * @param route маршрут, по которому осуществляется рейс
     */
    @Override
    public void setRoute(Route route) {
        getProxy().setRoute(route);
    }

    /**
     * Установить дни недели осуществления рейсов по маршруту
     * @param routingDays дни недели осуществления рейсов по маршруту
     */
    @Override
    public void setRoutingDays(List<DaysOfWeek> routingDays) {
        getProxy().setRoutingDays(routingDays);
    }

    /**
     * Установить время в пути
     * @throws BusinessException время отправления позже времени прибытия
     */
    @Override
    public void setTravelTime() throws BusinessException {
        getProxy().setTravelTime();
    }

    /**
     * Метод, возвращающий текстовое представление объекта
     * @return текстовое представление объекта
     */
    @Override
    public String toString() {
        return "ScheduledItemProxy{" + "id=" + id + ", proxyObject=" + getProxy() + '}';
    }
}
